package pojo;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.util.List;
import java.lang.reflect.Field;

/**
 * ExcelExporter类用于将泛型数据列表导出到Excel文件。
 *
 * @param <T> 数据类型
 */
public class ExcelExporter<T> {
    private List<T> dataList;
    private String filePath;
    private String sheetName;

    /**
     * 构造函数，初始化ExcelExporter对象。
     *
     * @param dataList  数据列表
     * @param filePath  Excel文件路径
     * @param sheetName 工作表名称
     */
    public ExcelExporter(List<T> dataList, String filePath, String sheetName) {
        this.dataList = dataList;
        this.filePath = filePath;
        this.sheetName = sheetName;
    }

    /**
     * 将数据列表导出到Excel文件。
     */
    public void exportToExcel() {
        try (Workbook workbook = new XSSFWorkbook();
             FileOutputStream fileOut = new FileOutputStream(filePath)) {

            Sheet sheet = workbook.createSheet(sheetName);

            // 使用反射动态创建标题行
            Row headerRow = sheet.createRow(0);
            Field[] fields = dataList.get(0).getClass().getDeclaredFields();
            for (int i = 0; i < fields.length; i++) {
                headerRow.createCell(i).setCellValue(fields[i].getName());
            }

            // 使用反射动态填充数据行
            int rowNum = 1;
            for (T data : dataList) {
                Row row = sheet.createRow(rowNum++);
                for (int i = 0; i < fields.length; i++) {
                    fields[i].setAccessible(true);
                    Object value = fields[i].get(data);
                    Cell cell = row.createCell(i);
                    if (value != null) {
                        if (value instanceof String) {
                            cell.setCellValue((String) value);
                        } else if (value instanceof Integer) {
                            cell.setCellValue((Integer) value);
                        }
                        // 根据需要添加更多数据类型
                    }
                }
            }

            // 将工作簿内容写入文件
            workbook.write(fileOut);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
